﻿namespace ECM7.Themes.ConfigEditor
{
	using System;
	using System.Collections.Generic;
	using System.Windows.Forms;
	using ECM7.Themes.Domain.Model;
	using ECM7.Themes.Domain.Model.Styles;
	using ECM7.Themes.Domain.Model.Templates;
	using ECM7.Themes.Domain.Services;

	/// <summary>
	/// Основная форма приложения
	/// </summary>
	public partial class MainForm : Form
	{
		/// <summary>
		/// Конструктор
		/// </summary>
		public MainForm()
		{
			InitializeComponent();
		}

		/// <summary>
		/// Сгенерировать конфигурационный файл
		/// </summary>
		private static void CreateToolStripMenuItemClick(object sender, EventArgs e)
		{
			Style style = CreateTestStyleTree();

			Template template = CreateTestTemplate();

			ThemeConfiguration cfg = new ThemeConfiguration
			{
				Templates = new Dictionary<Guid, Template>(),
				Style = style
			};

			cfg.Templates.Add(Guid.NewGuid(), template);

			template = new Template
			{
				Name = "test2.ru",
				Description = "Тестовое описание",
				FilePath = "test-template.vm",
				Parameters = new Dictionary<Guid, TemplateParameter>(),
				Contents = new List<PlaceHolder>()
			};

			PlaceHolder content = new PlaceHolder
								{
									Name = "main",
									PreviewContent = new PlaceHolderContent
										{
											Content = "content2.vm",
											IsFile = true
										},
									RealContent = new PlaceHolderContent
									{
										Content = "Новости",
										IsFile = false
									}
								};

			TemplateParameter templateParam = new TemplateParameter
												{
													Name = "Header",
													Description = "Заголовок"
												};

			template.Parameters.Add(Guid.NewGuid(), templateParam);

			templateParam = new TemplateParameter
			{
				Name = "Author",
				Description = "Автор"
			};
			template.Parameters.Add(Guid.NewGuid(), templateParam);

			template.Contents.Add(content);

			cfg.Templates.Add(Guid.NewGuid(), template);

			JsonHelper.SaveToFile("D:\\Проект темы для сайта\\configuration.json", cfg);
		}

		/// <summary>
		/// Создать шаблон, заполненный тестовыми данными
		/// </summary>
		private static Template CreateTestTemplate()
		{
			Template template = new Template
									{
										Name = "test1.ru",
										Description = "Тестовое описание",
										FilePath = "test-template.vm",
										Parameters = new Dictionary<Guid, TemplateParameter>(),
										Contents = new List<PlaceHolder>()
									};

			PlaceHolder content = new PlaceHolder
								{
									Name = "main",
									PreviewContent = new PlaceHolderContent
										{
											Content = "content1.vm",
											IsFile = true
										},
									RealContent = new PlaceHolderContent
										{
											Content = "Новости",
											IsFile = false
										}
								};

			template.Contents.Add(content);

			TemplateParameter templateParam = new TemplateParameter
												{
													Name = "Header",
													Description = "Заголовок"
												};

			template.Parameters.Add(Guid.NewGuid(), templateParam);

			templateParam = new TemplateParameter
								{
									Name = "Author",
									Description = "Автор"
								};

			template.Parameters.Add(Guid.NewGuid(), templateParam);
			return template;
		}

		/// <summary>
		/// Создаем тестовое дерево стилей
		/// </summary>
		private static Style CreateTestStyleTree()
		{
			Style childStyle = new Style
								{
									Parameters = new Dictionary<Guid, StyleParameter>(),
									Name = "Основные элементы"
								};

			StyleParameter styleParam = new StyleParameter
								{
									Name = "Страница",
									Selector = "body",
									Description = "body",
									DefaultValue = "font-family: Tahoma;\r\nfont-size: 10pt;"
								};

			childStyle.Parameters.Add(Guid.NewGuid(), styleParam);

			styleParam = new StyleParameter
							{
								Name = "Заголовки 1 уровня",
								Selector = "h1",
								Description = "h1",
								DefaultValue = "h1"
							};

			childStyle.Parameters.Add(Guid.NewGuid(), styleParam);

			styleParam = new StyleParameter
							{
								Name = "Заголовки 2 уровня",
								Selector = "h2",
								Description = "h2",
								DefaultValue = "h2"
							};

			childStyle.Parameters.Add(Guid.NewGuid(), styleParam);

			styleParam = new StyleParameter
							{
								Name = "Поля ввода",
								Selector = "input",
								Description = "input"
							};

			childStyle.Parameters.Add(Guid.NewGuid(), styleParam);

			styleParam = new StyleParameter
							{
								Name = "Ссылки",
								Selector = "ref",
								Description = "ref"
							};

			childStyle.Parameters.Add(Guid.NewGuid(), styleParam);

			Style style = new Style
							{
								Parameters = new Dictionary<Guid, StyleParameter>(),
								ChildStyles = new List<Style>()
							};

			style.ChildStyles.Add(childStyle);

			childStyle = new Style
							{
								Parameters = new Dictionary<Guid, StyleParameter>(),
								Name = "Подвал"
							};

			styleParam = new StyleParameter
							{
								Name = "Основной текст",
								Selector = ".footer",
								Description = ".footer"
							};

			childStyle.Parameters.Add(Guid.NewGuid(), styleParam);

			styleParam = new StyleParameter
							{
								Name = "Ссылки",
								Selector = ".footer a",
								Description = ".footer a"
							};

			childStyle.Parameters.Add(Guid.NewGuid(), styleParam);

			style.ChildStyles.Add(childStyle);

			childStyle = new Style
							{
								Parameters = new Dictionary<Guid, StyleParameter>(),
								Name = "Заголовок страницы"
							};

			styleParam = new StyleParameter
							{
								Name = "Основной текст",
								Selector = ".header",
								Description = ".header"
							};

			childStyle.Parameters.Add(Guid.NewGuid(), styleParam);

			styleParam = new StyleParameter
							{
								Name = "Ссылки",
								Selector = ".header a",
								Description = ".header a"
							};

			childStyle.Parameters.Add(Guid.NewGuid(), styleParam);

			style.ChildStyles.Add(childStyle);
			return style;
		}
	}
}
